home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / 8bit / cislib_b / ramxl.act < prev    next >
Text File  |  1995-04-22  |  5KB  |  182 lines

  1. MODULE; RAMXL.ACT 
  2. ;------------------------------------- 
  3. ; Copyright 1985 by Daniel L. Moore. 
  4. ; RAMXL may not be sold, but may be 
  5. ; freely copied and distributed. 
  6. ;------------------------------------- 
  7. ; Last modified on 03/30/85 
  8. ;------------------------------------- 
  9.  
  10. ;   Support routines for the "extra"  
  11. ; 14K of RAM in XLs that is located 
  12. ; under the OS ROM. 
  13. ;   When an interrupt occurs and the OS 
  14. ; is banked out, the RAMXL will bank 
  15. ; the OS in, and then call the ROM OX 
  16. ; interrupt handler.  When control 
  17. ; returns from the ROM OS, the OS is  
  18. ; banked out, and control is returned 
  19. ; to the original program. 
  20.  
  21. ;   Only the NMI and IRQ vectors are   
  22. ; supported, since the XL hardware banks 
  23. ; the OS ROM in automatically when a  
  24. ; chip reset occurs (the RESET button). 
  25.  
  26. DEFINE  INT_VECTOR = "$FFF0" 
  27.  
  28. CARD    NMI_Vector = $FFFA, 
  29.         RES_Vector = $FFFC, 
  30.         IRQ_Vector = $FFFE, 
  31.         Return_Addr  
  32.  
  33. BYTE    PortB      = $D301,   
  34.         NMIEN      = $D40E, 
  35.         X_Storage 
  36.  
  37. PROC OS_In=*() ; ROM OS resident 
  38.  [$AD PortB    ; LDA PortB 
  39.   $09 $01      ; ORA #$01  toggle OS bit to ON 
  40.   $8D PortB    ; STA PortB 
  41.   $60]         ; RTS 
  42.  
  43. PROC OS_Out=*(); ROM OS not resident 
  44.  [$AD PortB    ; LDA PortB 
  45.   $29 $FE      ; AND #$FE  toggle OS bit to OFF 
  46.   $8D PortB    ; STA PortB 
  47.   $60]         ; RTS 
  48.  
  49. PROC JMP_Vector=*() 
  50.  [$4C $FFFF]   ; JMP $FFFF   
  51.  
  52. PROC Handle_Interrupt=*()              
  53. ; Handle the interrupt that just occured. 
  54.  
  55.  [$8E X_Storage    ; STX X_Storage 
  56.   $AA              ; TAX        A=the interrupt number 
  57.   $20 OS_In        ; JSR OS_In  
  58.  
  59. ; Get the address of the desired interrupt routine 
  60.   $BD INT_VECTOR   ; LDA INT_VECTOR,X  
  61.   $8D JMP_Vector+1 ; STA JMP_VECTOR 
  62.   $BD INT_VECTOR+1 ; LDA INT_VECTOR,X 
  63.   $8D JMP_Vector+2 ; STA JMP_VECTOR+1 
  64.  
  65. ; Setup the stack to fake an interrupt and call 
  66. ; the OS ROM interrupt code. 
  67.  
  68. ; First the return address 
  69.   $AD Return_Addr+1; LDA Return_Addr+1 
  70.   $48              ; PHA 
  71.   $AD Return_Addr  ; LDA Return_Addr 
  72.   $48              ; PHA 
  73. ; Then the proccessor status register 
  74.   $58              ; CLI      enable IRQs, for Stage 2 VBLANK 
  75.   $08              ; PHP  
  76.    
  77.   $4C JMP_Vector]  ; JMP JMP_Vector 
  78.  
  79. PROC Return_Here=*() 
  80. ; Return here after the ROM OS interrupt code runs 
  81. ; Bank the OS out, the return to the 
  82. ; original program. 
  83.  [$20 OS_Out       ; JSR OS_Out 
  84.   $AE X_Storage    ; LDX X_Storage 
  85.   $68              ; PLA    from NMI.Handler or IRQ.Handler 
  86.   $40]             ; RTI  
  87.  
  88. PROC NMI_Handler=*() 
  89. ; Handle NMIs that occur while the OS is 
  90. ; banked out. Save the A reg, then get  
  91. ; the vector number and call Handle_Interrupt. 
  92.  [$48              ; PHA 
  93.   $A9 $0A          ; LDA #$0A 
  94.   $4C Handle_Interrupt]; JMP Handle_Interrrupt 
  95.  
  96. PROC IRQ_Handler=*() 
  97.  [$48              ; PHA 
  98.   $A9 $0E          ; LDA #$0A 
  99.   $4C Handle_Interrupt]; JMP Handle_Interrrupt 
  100.  
  101. ;------------------------------------- 
  102. ; End of actual interrupt code. 
  103. ; All that is left is installing  
  104. ; the vectors to the routines. 
  105. ;-------------------------------------  
  106.  
  107. PROC Install_CharSet() 
  108. ; Copy the ROM char set at $E000 to $E3FF 
  109. ; to the RAM bank, so that characters do 
  110. ; not flicker when the RAM is accessed. 
  111. ; If this is done, do not use the RAM 
  112. ; from $E000 to $E3FF (57344 to 58367). 
  113.  BYTE POINTER where 
  114.  BYTE temp 
  115.   
  116.  FOR where=$E000 TO $E3FF 
  117.  DO 
  118.   OS_In() 
  119.   temp=where^ 
  120.   OS_Out() 
  121.   where^=temp 
  122.  OD 
  123.  OS_In() 
  124. RETURN 
  125.  
  126. PROC Install_Interrupts() 
  127.  
  128.  Return_Addr=Return_Here; Set the return address pointer 
  129.  
  130.  NMIEN=0  ; Turn all NMI interrupts off. 
  131.  [$78]    ; SEI  Turn all IRQ interrupts off. 
  132.  
  133.  OS_Out() 
  134.  
  135. ; Install the new interrupt routines 
  136. ; vectors at $FFFA to $FFFF under the 
  137. ; OS ROM. 
  138.  NMI_Vector = NMI_Handler 
  139.  IRQ_Vector = IRQ_Handler 
  140.  
  141.  OS_In() 
  142.  
  143.  [$58]    ; CLI  Turn IRQs back on. 
  144.  NMIEN=$40; Turn NMIs back on. 
  145.  
  146.  Install_CharSet() 
  147. RETURN 
  148.  
  149. ;------------------------------------- 
  150. ; Now the routine that lets you get to 
  151. ; the RAM that is under the OS. 
  152. ; There are actually 2 memory areas 
  153. ; present:  
  154. ;    4K at $C000 to $CFFF, 49152 to 53247 
  155. ;   10K at $D800 to $FFFF, 55296 to 65535 
  156. ; The last 6 bytes of the 10K area are not 
  157. ; usable, since that is where the interrupt 
  158. ; routines are located.  Therefore do not 
  159. ; use any RAM above $FFF9 (65529) or you 
  160. ; will crash the system. 
  161. ;-------------------------------------  
  162.  
  163. PROC MoveBlockXL(BYTE POINTER dest,source, CARD size) 
  164. ; This is a version of MoveBlock that lets 
  165. ; you use the extra RAM in XLs. 
  166.  
  167.  OS_Out() 
  168.  FOR dest=dest TO dest+size 
  169.  DO 
  170.    dest^=source^  
  171.    source==+1 
  172.  OD 
  173.  OS_In() 
  174. RETURN 
  175.  
  176. MODULE; For user. 
  177.  
  178.  
  179.  
  180.  
  181.